package br.com.monitorimoveis.batch;

import java.util.List;

import br.com.monitorimoveis.comum.entidade.Anuncio;
import br.com.monitorimoveis.comum.entidade.InfoColeta;
import br.com.monitorimoveis.comum.servico.IAnuncioService;
import br.com.monitorimoveis.comum.servico.IInfoColetaService;
import br.com.monitorimoveis.comum.util.Convert;

public class App {

	public static void main(String[] args) {

		//coletarAnuncioTeste();

		// atualizarAnuncioTeste();

		dispararColetaComAtualizacao();

		// coletarPendentes();

		// deletarAnunciosDuplicados();

		// deletarHistoricosDuplicados();
	}

	private static void deletarAnunciosDuplicados() {
		IAnuncioService anuncioService = (IAnuncioService) Contexto.get()
				.getBean("anuncioService");

		anuncioService.deletarAnunciosDuplicados();
	}

	private static void deletarHistoricosDuplicados() {
		IAnuncioService anuncioService = (IAnuncioService) Contexto.get()
				.getBean("anuncioService");

		anuncioService.deletarHistoricosDuplicados();
	}

	private static void coletarAnuncioTeste() {
		IAnuncioService anuncioService = (IAnuncioService) Contexto.get()
				.getBean("anuncioService");

		ColetaWImoveisService servico = new ColetaWImoveisService();

		String urlAnuncio = null;

		// urlAnuncio =
		// "http://www.wimoveis.com.br/imovel/venda-apartamento-guara-df-2-quartos-qi-05-bloco-h-824839";

		// urlAnuncio =
		// "http://www.wimoveis.com.br/imovel/aluguel-apartamento-guara-df-3-quartos-qi-27-lote-03-608958";

		// urlAnuncio =
		// "http://www.wimoveis.com.br/imovel/venda-apartamento-guara-df-2-quartos-qe-12-1159833";

		//urlAnuncio = "http://www.wimoveis.com.br/imovel/venda-lote-terreno-gama-df-quadra-03-646075";

		//urlAnuncio = "http://www.wimoveis.com.br/imovel/venda-apartamento-guara-df-4-quartos-qi-29-862358";
		
		urlAnuncio = "http://www.wimoveis.com.br/imovel/venda-apart-hotel-flat-aguas-claras-df-1-quarto-rua-jeriva-1057147";
		
		Anuncio anuncio = null;
		try {
			anuncio = servico.coletarAnuncio(urlAnuncio);
			anuncioService.inserir(anuncio);
			System.out.println("ANUNCIO INSERIDO COM SUCESSO!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void atualizarAnuncioTeste() {
		IAnuncioService anuncioService = (IAnuncioService) Contexto.get()
				.getBean("anuncioService");

		ColetaWImoveisService servico = new ColetaWImoveisService();

		InfoColeta info = new InfoColeta();
		info.setCodAnuncio(1159833);
		info.setData(Convert.strToDate("15/01/14"));
		// info.setUrl("http://www.wimoveis.com.br/imovel/venda-apartamento-guara-df-4-quartos-qi-29-140743");

		//info.setUrl("http://www.wimoveis.com.br/imovel/venda-apartamento-guara-df-2-quartos-qe-12-1159833");

		info.setUrl("http://www.wimoveis.com.br/imovel/venda-apart-hotel-flat-aguas-claras-df-1-quarto-rua-jeriva-1057147");
		
		Anuncio anuncio = anuncioService.getByCodigo(info.getCodAnuncio());

		if (anuncio == null) {
			System.out.println("Inserindo anuncio com o código "
					+ info.getCodAnuncio());

			// obter anuncio...
			try {
				anuncio = servico.coletarAnuncio(info.getUrl());
				anuncioService.inserir(anuncio);
			} catch (Exception e) {
				e.printStackTrace();
			}
			return;
		}

		if (info.getData() != null
				&& info.getData().after(anuncio.getDataAtualizacao())) {
			// atualizar anuncio...
			Anuncio atualizado;
			try {
				atualizado = servico.coletarAnuncio(info.getUrl());
				anuncioService.atualizar(anuncio.getIdAnuncio(), atualizado);
			} catch (Exception e) {
				e.printStackTrace();
			}
			// Comparar campo a campo...

		} else {
			System.out.println("Não é necessário atualizar o anúncio "
					+ info.getCodAnuncio());
		}

	}

	// http://www.wimoveis.com.br/df/guara/vaga/venda/?busca=galeria&quarto=todos&o=F&planta=1&pronto=1

	/**
	 * Coleta os anuncios que estão pendentes no banco de dados (por algum erro
	 * não foram coletados anteriormente).
	 * 
	 */
	private static void coletarPendentes() {

		ColetaWImoveisService servico = new ColetaWImoveisService();
		IAnuncioService anuncioService = (IAnuncioService) Contexto.get()
				.getBean("anuncioService");
		IInfoColetaService servicoInfoColeta = (IInfoColetaService) Contexto.get()
				.getBean("infoColetaService");

		List<InfoColeta> urls = servicoInfoColeta.listarPendentes();
		System.out.println("Numero de anuncios a serem coletados: "
				+ urls.size());
		Anuncio anuncio = null;
		int contador = 1;
		for (InfoColeta infoColeta : urls) {
			if (contador % 50 == 0) {
				System.out.println("Obtendo anuncio " + contador);
			}
			try {
				contador++;
				System.out.print("Obtendo -> " + infoColeta.getUrl());
				anuncio = servico.coletarAnuncio(infoColeta.getUrl());
				anuncioService.inserir(anuncio);
				infoColeta.setColetado(true);
				servicoInfoColeta.atualizar(infoColeta);

				Thread.sleep(500);
				System.out.print("   ->  OK");
			} catch (Exception e) {
				System.out.println("   ->  FAIL!!!");
				e.printStackTrace();
			}
		}

	}

	/**
	 * Roda a coleta dos anuncios do WImoveis. 1. Obtem os URLS para pesquisa a
	 * partir do Gerador de URLs 2. Realiza as pesquisas e gera uma lista de
	 * InfoColeta com as URLs dos anuncios 3. Coleta cada anuncio retornado nas
	 * pesquisas 4. Grava os anuncios no BD.
	 * 
	 */
	private static void dispararColeta() {
		ColetaWImoveisService servico = new ColetaWImoveisService();
		IAnuncioService anuncioService = (IAnuncioService) Contexto.get()
				.getBean("anuncioService");

		List<InfoColeta> urls = servico.coletarURLsAnuncios();
		Anuncio anuncio = null;

		System.out
				.println("*************** INICIANDO A COLETA DOS ANUNCIOS ****************");
		for (InfoColeta url : urls) {
			System.out.println(url.getUrl());
			try {
				anuncio = servico.coletarAnuncio(url.getUrl());
				anuncioService.inserir(anuncio);
				url.setColetado(true);
				Thread.sleep(1000);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		System.out
				.println("*************** FINALIZANDO A COLETA DOS ANUNCIOS ****************");

		System.out
				.println("//////////////////////////////////////////////////////////");
		System.out.println("URLS não coletados | PROBLEMA ");
		for (InfoColeta infoColetaAnuncio : urls) {

			if (!infoColetaAnuncio.isColetado()) {
				System.out.println(infoColetaAnuncio.getUrl());
			}
		}
		System.out
				.println("//////////////////////////////////////////////////////////");
	}

	private static void dispararColetaComAtualizacao() {
		ColetaWImoveisService servico = new ColetaWImoveisService();
		IAnuncioService anuncioService = (IAnuncioService) Contexto.get()
				.getBean("anuncioService");
		IInfoColetaService infoService = (IInfoColetaService) Contexto.get()
				.getBean("infoColetaService");

		List<InfoColeta> infos = servico.coletarURLsAnuncios();
		Anuncio anuncio = null;

		System.out
				.println("*************** INICIANDO A COLETA DOS ANUNCIOS ****************");
		for (InfoColeta info : infos) {
			System.out.println("============== Analisando anuncio: " + info.getUrl());
			try {
				anuncio = anuncioService.getByCodigo(info.getCodAnuncio());

				// Se o anuncio não existir no BD...
				if (anuncio == null) {
					// obter anuncio...
					anuncio = servico.coletarAnuncio(info.getUrl());
					System.out.println("Inserindo anuncio com o código "
							+ info.getCodAnuncio());
					anuncioService.inserir(anuncio);
					info.setColetado(true);
				} else {
					// Se o anuncio do site está mais atual que o do BD, tenho
					// que atualiza-lo.
					if (info.getData() != null
							&& info.getData().after(
									anuncio.getDataAtualizacao())) {
						System.out.println("Atualizando anúncio "
								+ info.getCodAnuncio());
						Anuncio atualizado = servico.coletarAnuncio(info
								.getUrl());
						anuncioService.atualizar(anuncio.getIdAnuncio(),
								atualizado);

					} else {
						System.out
								.println("Anuncio já existente e atualizado -  "
										+ info.getCodAnuncio());
					}
				}

				Thread.sleep(800);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

//		System.out
//				.println("*************** FINALIZANDO A COLETA DOS ANUNCIOS ****************");
//
//		System.out
//				.println("//////////////////////////////////////////////////////////");
//		System.out.println("URLS não coletados | PROBLEMA ");
//		for (InfoColeta infoColetaAnuncio : infos) {
//
//			if (!infoColetaAnuncio.isColetado()) {
//				System.out.println(infoColetaAnuncio.getUrl());
//			}
//		}
//		System.out
//				.println("//////////////////////////////////////////////////////////");
	}

}
